package demo.practice.dp;

public class P1567 {


    //[1,-2,-3,4]
    //dp[0]= 1  dp_min[0]=0
    //dp[1]= 0  dp_min[1]= dp[0]+1  ,因为是 dp[0] 个正数x num[i]变成了负数
    //dp[2]=

    //和152这道题是一样的思路
    // 当前值是正数，
    public static void main(String[] args) {
        P1567 p1567= new P1567();
        p1567.getMaxLen(new int[]{0,1,-2,-3,-4});
    }

    public int getMaxLen(int[] nums) {

        //dp[i] 代表 以nums[i]结尾的乘积为正数的最长子数组的长度
        int[] dp = new int[nums.length];

        //dp[i] 代表 以nums[i]结尾的乘积为负数的最长子数组的长度
        int[] dp_min = new int[nums.length];
        dp[0] =nums[0]==0?0: nums[0] > 0 ? 1 : 0;
        dp_min[0] =nums[0]==0?0: nums[0] > 0 ? 0 : 1;

        for (int i = 1; i < nums.length; i++) {
            int cur = nums[i];
            if (cur == 0) {
                //直接断掉了
                dp[i] = 0;
                dp_min[0] = 0;
            } else if (cur > 0) {
                dp[i] = dp[i - 1] + 1;
                if (dp_min[i - 1] > 0) {
                    dp_min[i] = dp_min[i - 1] + 1;// dp_min[i - 1]中元素xnums[i]也是小于0的
                } else {
                    //前面全都是大于0的
                    dp_min[i] = 0;
                }
            } else {
                //cur <0
                if (dp_min[i - 1] > 0) {
                    // dp_min[i - 1]中元素xnums[i] 是个正数
                    dp[i] = dp_min[i - 1] + 1;
                } else {
                    dp[i] = 0;
                }

                //  dp[i-1]中元素xnums[i] 是个负数
                dp_min[i] = dp[i-1] + 1;
            }
        }


        int max = dp[0];
        for (int i = 0; i < nums.length; i++) {
            max = Math.max(dp[i], max);
        }
        return max;
    }


}
